package concurrent.book;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/***
 * 加锁的含义不仅仅局限于互斥行为，还包括内存可见性。为了确保所有线程都能看到共享变量的最新值，
 * 所有执行读操作或者写操作的线程都必须在同一个锁上同步。
 *
 * 非原子的64位操作是非线程安全的
 *
 * 当把变量声明为volatile类型后，编译器与运行时都会注意到这个变量是共享的，
 * 因此编译器不会将该变量上的操作与其他内存操作一起重排序。
 * volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方，因此在读取volatile类型的变量时总会返回最新写入的值
 * 在访问volatile变量时不会执行加锁操作，因此也就不会执行线程阻塞，因此volatile变量是一种比sychronized关键字更轻量级的同步机制
 *
 * 加锁机制可以确保可见性又可以确保原子性，而volatile变量只能确保可见性
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ThreadSafe {

}
